package com.example.nio.network.channel;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;

/**
 * @author panghu
 * @version 1.0.0
 * @createTime 2023年08月06日 16:24:00
 * @Description
 */
public class ChannelServer {

    public static void main(String[] args) {
        // 创建一个新的ServerSocketChannel对象，一会直接使用它进行网络io操作
        try (ServerSocketChannel socketChannel = ServerSocketChannel.open()) {
            // 绑定端口
            socketChannel.bind(new InetSocketAddress(8888));
              // 传统的Bio
//            while (true) {
//                // 等待连接
//                SocketChannel socket = socketChannel.accept();
//                //因为是通道，两端的信息都是可以明确的，这里获取远端地址，当然也可以获取本地地址
//                System.out.println("客户端已连接，IP地址为：" + socket.getRemoteAddress());
//                //使用缓冲区进行数据接收
//                ByteBuffer buffer = ByteBuffer.allocate(128);
//                socket.read(buffer);
//                buffer.flip();
//                System.out.print("接收到客户端数据：" + new String(buffer.array(), 0, buffer.remaining()));
//
//                // 直接向通道中写入数据返回给client
//                socket.write(ByteBuffer.wrap("已经收到.".getBytes()));
//                // 记得关闭通道
//                socket.close();
//            }

            // 接受请求单线程，处理请求多线程
            while (true) {
                // 等待连接
                SocketChannel socket = socketChannel.accept();
                //因为是通道，两端的信息都是可以明确的，这里获取远端地址，当然也可以获取本地地址
                System.out.println("客户端已连接，IP地址为：" + socket.getRemoteAddress());
                new Thread(() -> {
                    try {
                        //使用缓冲区进行数据接收
                        ByteBuffer buffer = ByteBuffer.allocate(128);
                        socket.read(buffer);
                        buffer.flip();
                        System.out.println("接收到客户端数据：" + new String(buffer.array(), 0, buffer.remaining()));

                        // 直接向通道中写入数据返回给client
                        socket.write(ByteBuffer.wrap("已经收到.".getBytes()));
                        // 记得关闭通道
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }).start();
            }

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}
